package modelo.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;

import modelo.Estado;
import modelo.Status;
import modelo.Ciudad;

/*
 * Maneja entidades:
 *   - Estados
 *   - Ciudades
 */

public class DAOEstados {
	protected HashMap<Integer, Estado> estados = new HashMap<Integer, Estado>();
	protected HashMap<Integer, Ciudad> ciudades = new HashMap<Integer, Ciudad>();
	
	public void cargarEstados() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM estado\n"
			);
		
		try {
			while (rs.next())
				estados.put(rs.getInt("cod_estado"), new Estado(rs.getInt("cod_estado"), rs.getString("nombre"), Status.valueOf(rs.getInt("status"))));
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<Estado> consultarEstados() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM estado\n"
			);
		
		return adjuntarEstado(rs);
	}
	
	public Estado consultarEstadoPorCodigo(int cod) {
		return estados.get(cod);
	}
	
	/*
	public Estado agregarEstado(String nombre, Status status) {
		try {
			ResultSet rs = Servidor.consultar(
				"INSERT INTO sucursal\n" +
				"    (nombre, status)\n" +
				"VALUES\n" +
				"	 ('" + nombre + "', " + status + ")\n" +
				"RETURNING cod_estado"
				);
				
			if (!rs.next()) return null;
				
			Estado e = new Estado(rs.getInt("cod_estado"), nombre, status);
			estados.put(e.getCodigo(), e);
			
			return e;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public Estado modificarEstado(Estado estado) {
		boolean b = Servidor.ejecutar(
			"UPDATE estado\n" +
			"SET nombre = '" + estado.getNombre() + "',\n" +
			"    status = '" + estado.getStatus() + "'\n" +
			"WHERE cod_estado = " + estado.getCodigo() + "\n"
			);
		
		if (!b) return null;
		
		return estado;
	}*/
	
	private ArrayList<Estado> adjuntarEstado(ResultSet rs) {
		ArrayList<Estado> lst = new ArrayList<Estado>();
		
		try {
			while (rs.next())
				lst.add(estados.get(rs.getInt("cod_estado")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
	
	public void cargarCiudades() {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM ciudad\n"
			);
		
		try {
			while (rs.next())
				ciudades.put(rs.getInt("cod_ciudad"), new Ciudad(rs.getInt("cod_ciudad"), rs.getString("nombre"), consultarEstadoPorCodigo(rs.getInt("cod_estado")), Status.valueOf(rs.getInt("status"))));
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList<Ciudad> consultarCiudadesPorEstado(int codigoEstado) {
		ResultSet rs = Servidor.consultar(
			"SELECT *\n" +
			"FROM ciudad\n" +
			"WHERE cod_estado = " + codigoEstado + "\n"
			);
		
		return adjuntarCiudad(rs);
	}
	
	public Ciudad consultarCiudadPorCodigo(int cod) {
		return ciudades.get(cod);
	}
	
	/*
	public Ciudad agregarCiudad(String nombre, Estado estado, Status status) {
		try {
			ResultSet rs = Servidor.consultar(
				"INSERT INTO estado\n" +
				"    (nombre, cod_estado, status)\n" +
				"VALUES\n" +
				"	 ('" + nombre + "', " + estado.getCodigo() + ", " + status.toInt() + ")\n" +
				"RETURNING cod_ciudad"
				);
				
			if (!rs.next()) return null;
				
			Ciudad s = new Ciudad(rs.getInt("cod_ciudad"), nombre, estado, status);
			ciudades.put(s.getCodigo(), s);
			
			return s;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	public Ciudad modificarCiudad(Ciudad ciudad) {
		boolean b = Servidor.ejecutar(
			"UPDATE ciudad\n" +
			"SET nombre = '" + ciudad.getNombre() + "',\n" +
			"    cod_estado = '" + ciudad.getEstado().getCodigo() + "',\n" +
			"    status = '" + ciudad.getStatus() + "'\n" +
			"WHERE cod_ciudad = " + ciudad.getCodigo() + "\n"
			);
		
		if (!b) return null;
		
		return ciudad;
	}
	*/
	
	private ArrayList<Ciudad> adjuntarCiudad(ResultSet rs) {
		ArrayList<Ciudad> lst = new ArrayList<Ciudad>();
		
		try {
			while (rs.next())
				lst.add(ciudades.get(rs.getInt("cod_ciudad")));
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return lst;
	}
}
